package com.annotation;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @功能：获取Class对象的属性和方法、获取类的运行时结构
 * @版本： V1
 * @版权： 信息技术有限公司（http://www.mychery.com/）
 * @作者： 磐石战队开发组  00355760
 * @日期： 2024/8/10 14:35
 */
public class demo05 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
        // 获得User的Class对象
        Class<?> c1 = Class.forName("com.annotation.User");
        /**
         * 【获得类的名字】
         * getName()是获得 包名+类名
         * getSimpleName()只会获得类名
         */
        System.out.println(c1.getName());
        // com.annotation.User
        System.out.println(c1.getSimpleName());
        // User
        System.out.println("****************************************");
        /**
         * 【获得类的属性】
         * getField() 指定属性名（只能获得public的属性，而且还能得到父类的属性）
         * getDeclaredField() 能获得自己所有的属性
         * getFields() 获得属性值的数组，但是使用范围同getFile一样，只能获得public属性，而且也能得到父类的public属性
         * getDeclaredFields() 获得自己所有的属性值（包含private修饰的属性），返回一个数组
         */
        System.out.println(c1.getField("name"));
        // 会报错，因为只能获得public修饰的属性
        System.out.println(c1.getDeclaredField("name"));
        // private java.lang.String demo.User.name
        Field[] fields = c1.getFields();
        fields = c1.getDeclaredFields();
        for(Field f : fields) {
            System.out.println(f);
        }
        System.out.println("****************************************");
        /**
         * 【获得类的方法】
         * getMethods() 获得本类及其父类所有的仅限public修饰的方法
         * getDeclaredMethods() 获得类自己所有的方法，甚至包括private，不能得到父类的方法
         */
        Method[] methods = c1.getMethods();
        //获得本类和父类的public方法
        methods = c1.getDeclaredMethods();
        //获得本类的全部方法
        for(Method m : methods) {
            System.out.println(m);
        }
        /**
         * 【获取构造器之类的方法】
         */
        Constructor[] constructors = c1.getConstructors();
        //获取public方法
        constructors = c1.getDeclaredConstructors();
        //获取全部方法
        for(Constructor c : constructors) {
            System.out.println(c);
        }
    }
}
